home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / ASM / ByteKillerClone.a < prev    next >
Encoding:
Text File  |  2001-09-16  |  17.1 KB  |  917 lines

  1. *******************************************************
  2. **     XFD external decruncher for CRUN Cruncher     **
  3. **        written by Mr. Larmer / Wanted Team        **
  4. **            fixed by SDI in 2000/2001             **
  5. **    small changes by Don Adan/WT in 2000/2001         **
  6. *******************************************************
  7.  
  8.     SECTION    CRUNDecrunch,CODE
  9.  
  10.     INCLUDE    "AINCLUDE:IncDirs.i"
  11.     INCLUDE    "libraries/xfdmaster.i"
  12.  
  13. ; xfdForeman structure MUST be first thing in all external decrunchers
  14. F_CRUN        moveq    #-1,d0        ;security
  15.         rts
  16.         dc.l    XFDF_ID        ;id
  17.         dc.w    1        ;version
  18.         dc.w    0
  19.         dc.l    0,0        ;private
  20.         dc.l    S_CRUN        ;first slave
  21.  
  22.         dc.b    "$VER: ByteKillerClone 2.4 (15.09.2001) by Wanted Team",0
  23. N_CRUN        dc.b    "(CRUN) Data Cruncher",0            ;done!
  24. N_CRND        dc.b    "(CRND) Data Cruncher",0            ;done!
  25. N_MARC        dc.b    "Exploder Style Data File",0            ;done!
  26. N_xVdg        dc.b    "(xVdg) Data Cruncher",0            ;done!
  27. N_AMOS        dc.b    "AMOS Compiler Cruncher",0
  28. N_ARPF        dc.b    "Action Replay II (ARPF) Data Cruncher",0    ;done!
  29. N_ARP3        dc.b    "Action Replay III (ARP3) Data Cruncher",0    ;done!
  30. N_ACE        dc.b    "(ACE!) Data Cruncher",0            ;done!
  31. N_Pepsi        dc.b    'PACK Data (Pepsi Game)',0            ;done!
  32.         even
  33.  
  34. **************************************************
  35.  
  36. ; xfdSlave structure: this one doesn't support segment decrunching
  37.  
  38. S_CRUN        dc.l    S_CRND        ;more slaves
  39.         dc.w    2        ;version
  40.         dc.w    39        ;master version
  41.         dc.l    N_CRUN        ;name
  42.         dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
  43.         dc.w    0
  44.         dc.l    RB_CRUN        ;recog buffer
  45.         dc.l    DB_CRUN        ;decrunch buffer
  46.         dc.l    0        ;recog segment
  47.         dc.l    0        ;decrunch segment
  48.         dc.w    0,0
  49.         dc.l    12+2
  50.  
  51. RB_CRUN        cmp.l    #'CRUN',(A0)+
  52.         bne.s    .Exit
  53.         tst.b    (A0)
  54.         bne.b    .Exit
  55.         move.l    (A0)+,D1
  56.         beq.b    .Exit
  57.         btst    #0,D1
  58.         bne.b    .Exit
  59.         moveq    #12,D0
  60.         add.l    D0,D1
  61.         move.l    D1,xfdrr_MinSourceLen(A1)
  62.         tst.b    (A0)
  63.         bne.b    .Exit
  64.         move.l    (A0),D1
  65.         beq.b    .Exit
  66.         bmi.b    .Exit
  67.         move.l    D1,xfdrr_MinTargetLen(A1)
  68.         move.l    D1,xfdrr_FinalTargetLen(A1)
  69.         moveq    #1,d0
  70.         rts
  71. .Exit        moveq    #0,d0
  72.         rts
  73.  
  74. DB_CRUN        movem.l    d2-d7/a2-a6,-(a7)
  75.         move.l    a0,a5
  76.         move.l    xfdbi_UserTargetBuf(A5),A1
  77.         move.l    xfdbi_SourceBuffer(A5),A0
  78.         move.l    4(a0),d0
  79.         move.l    8(a0),d1
  80.         lea    12(a0),a0
  81.         movea.l    a1,a2
  82.         adda.l    d1,a2
  83.         adda.l    d0,a0
  84.         move.l    -(a0),d5
  85.         move.l    -(a0),d0
  86.         bsr.s    D_CRUN
  87.         tst.l    d0
  88.         bne.b    Error
  89.         moveq    #1,d0
  90. Exit        movem.l    (a7)+,d2-d7/a2-a6
  91.         rts
  92.  
  93. Error2        move.l    xfdbi_TargetBufLen(a5),d0
  94.         move.l    xfdbi_TargetBuffer(a5),a1
  95.         jsr    -210(a6)
  96. Error        move.w    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  97.         moveq    #0,d0
  98.         bra.b    Exit
  99.  
  100. **************************************************
  101.  
  102. Eoruj        move.l    -(a0),d0
  103.         eor.l    d0,d5
  104.         move.w    #$0010,ccr
  105.         roxr.l    #1,d0
  106.         rts
  107.  
  108. D_CRUN        movem.l    d0-d7/a0-a6,-(sp)
  109.         eor.l    d0,d5
  110. lbC000046:    lsr.l    #1,d0
  111.         bne.s    lbC000054
  112.         bsr.b    Eoruj
  113. lbC000054:    bcs.s    lbC0000B0
  114.         moveq    #8,d1
  115.         moveq    #1,d3
  116.         lsr.l    #1,d0
  117.         bne.s    lbC000068
  118.         bsr.b    Eoruj
  119. lbC000068:    bcs.w    lbC0000FE
  120.         moveq    #3,d1
  121.         clr.w    d4
  122. lbC000070:    subq.w    #1,d1
  123.         clr.w    d2
  124. lbC000074:    lsr.l    #1,d0
  125.         bne.s    lbC000082
  126.         move.l    -(a0),d0
  127.         eor.l    d0,d5
  128.         move.w    #$0010,ccr
  129.         roxr.l    #1,d0
  130. lbC000082:    roxl.l    #1,d2
  131.         dbra    d1,lbC000074
  132.         move.w    d2,d3
  133.         add.w    d4,d3
  134. lbC00008C:    moveq    #7,d1
  135. lbC00008E:    lsr.l    #1,d0
  136.         bne.s    lbC00009C
  137.         move.l    -(a0),d0
  138.         eor.l    d0,d5
  139.         move.w    #$0010,ccr
  140.         roxr.l    #1,d0
  141. lbC00009C:    roxl.l    #1,d2
  142.         dbra    d1,lbC00008E
  143.         cmpa.l    a1,a2
  144.         ble.w    lbC00013A
  145.         move.b    d2,-(a2)
  146.         dbra    d3,lbC00008C
  147.         bra.s    lbC000120
  148. lbC0000AA:    moveq    #8,d1
  149.         moveq    #8,d4
  150.         bra.s    lbC000070
  151. lbC0000B0:    moveq    #2,d1
  152.         subq.w    #1,d1
  153.         clr.w    d2
  154. lbC0000B6:    lsr.l    #1,d0
  155.         bne.s    lbC0000C4
  156.         move.l    -(a0),d0
  157.         eor.l    d0,d5
  158.         move.w    #$0010,ccr
  159.         roxr.l    #1,d0
  160. lbC0000C4:    roxl.l    #1,d2
  161.         dbra    d1,lbC0000B6
  162.         cmpi.b    #2,d2
  163.         blt.s    lbC0000F6
  164.         cmpi.b    #3,d2
  165.         beq.s    lbC0000AA
  166.         moveq    #8,d1
  167.         subq.w    #1,d1
  168.         clr.w    d2
  169. lbC0000DC:    lsr.l    #1,d0
  170.         bne.s    lbC0000EA
  171.         move.l    -(a0),d0
  172.         eor.l    d0,d5
  173.         move.w    #$0010,ccr
  174.         roxr.l    #1,d0
  175. lbC0000EA:    roxl.l    #1,d2
  176.         dbra    d1,lbC0000DC
  177.         move.w    d2,d3
  178.         moveq    #12,d1
  179.         bra.s    lbC0000FE
  180. lbC0000F6:    moveq    #9,d1
  181.         add.w    d2,d1
  182.         addq.w    #2,d2
  183.         move.w    d2,d3
  184. lbC0000FE:    subq.w    #1,d1
  185.         clr.w    d2
  186. lbC000102:    lsr.l    #1,d0
  187.         bne.s    lbC000110
  188.         move.l    -(a0),d0
  189.         eor.l    d0,d5
  190.         move.w    #$0010,ccr
  191.         roxr.l    #1,d0
  192. lbC000110:    roxl.l    #1,d2
  193.         dbra    d1,lbC000102
  194. lbC000116:    subq.w    #1,a2
  195.         cmpa.l    a1,a2
  196.         blt.s    lbC00013A
  197.         move.b    0(a2,d2.w),(a2)        ;move.b -1(A2,D2.W),-(A2)
  198.         dbra    d3,lbC000116
  199. lbC000120:    cmpa.l    a2,a1
  200.         blt.w    lbC000046
  201.         tst.l    d5
  202.         bne.s    lbC00013A
  203.         movem.l    (sp)+,d0-d7/a0-a6
  204.         moveq    #0,d0
  205.         rts
  206. lbC00013A:    movem.l    (sp)+,d0-d7/a0-a6
  207.         moveq    #-1,d0
  208.         rts
  209.  
  210. **************************************************
  211.  
  212. S_CRND        dc.l    S_MARC        ;more slaves
  213.         dc.w    2        ;version
  214.         dc.w    39        ;master version
  215.         dc.l    N_CRND        ;name
  216.         dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
  217.         dc.w    0
  218.         dc.l    RB_CRND        ;recog buffer
  219.         dc.l    DB_CRND        ;decrunch buffer
  220.         dc.l    0        ;recog segment
  221.         dc.l    0        ;decrunch segment
  222.         dc.w    0,0
  223.         dc.l    12+2
  224.  
  225. RB_CRND        cmp.l    #"CRND",(A0)+
  226.         bne.s    .Exit
  227.         tst.b    (A0)
  228.         bne.b    .Exit
  229.         move.l    (A0),D1
  230.         beq.b    .Exit
  231.         btst    #0,D1
  232.         bne.b    .Exit
  233.         add.l    D1,A0
  234.         moveq    #20,D0
  235.         add.l    D0,D1
  236.         move.l    D1,xfdrr_MinSourceLen(A1)
  237.         move.l    (A0),D1
  238.         beq.b    .Exit
  239.         bmi.b    .Exit
  240.         move.l    D1,xfdrr_MinTargetLen(A1)
  241.         move.l    D1,xfdrr_FinalTargetLen(A1)
  242.         moveq    #1,d0
  243.         rts
  244. .Exit        moveq    #0,d0
  245.         rts
  246.  
  247. DB_CRND        movem.l    d2-d7/a2-a6,-(a7)
  248.         move.l    a0,a5
  249.  
  250.         move.l    xfdbi_UserTargetBuf(A5),A1
  251.         move.l    xfdbi_SourceBuffer(A5),A0
  252.         move.l    xfdbi_MinSourceLen(A5),D0
  253.  
  254.         move.l    a0,a4
  255.         adda.l    D0,A0
  256.         movem.l    -8(a0),a2/a3
  257.         movem.l    a2/a3,(a4)
  258.         LEA    -16(A0),A0
  259.         movea.l    (A0),A2
  260.         adda.l    A1,A2
  261.  
  262.         move.l    4(a0),d5
  263.         move.l    -(a0),d0
  264.  
  265.         bsr.w    D_CRUN
  266.  
  267.         tst.l    d0
  268.         bne.w    Error
  269.  
  270.         moveq    #1,d0
  271. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  272.         rts
  273.  
  274. **************************************************
  275.  
  276. S_MARC        dc.l    S_xVdg        ;more slaves
  277.         dc.w    2        ;version
  278.         dc.w    39        ;master version
  279.         dc.l    N_MARC        ;name
  280.         dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
  281.         dc.w    0
  282.         dc.l    RB_MARC        ;recog buffer
  283.         dc.l    DB_MARC        ;decrunch buffer
  284.         dc.l    0        ;recog segment
  285.         dc.l    0        ;decrunch segment
  286.         dc.w    0,0
  287.         dc.l    12+2
  288.  
  289. RB_MARC        move.l    D2,-(A7)
  290.         btst    #0,D0
  291.         bne.b    .Exit
  292.         move.l    A0,D2
  293.         add.l    D0,A0
  294. .FindCos    cmp.l    D2,A0
  295.         beq.b    .Exit
  296.         tst.w    -(A0)
  297.         beq.b    .FindCos
  298.         subq.l    #2,A0
  299.         cmp.l    #'MARC',(A0)
  300.         beq.b    .OK
  301.         cmp.l    #'TMB!',(A0)
  302.         beq.b    .OK
  303.         cmp.l    #'TXIC',(A0)
  304.         beq.b    .OK
  305.         cmp.l    #'SCC!',(A0)
  306.         beq.b    .OK
  307.         cmp.l    #'ons ',(A0)
  308.         bne.b    .Exit
  309.         cmp.l    #' Sym',-(A0)
  310.         bne.b    .Exit
  311.         cmp.l    #'Gary',-(A0)
  312.         bne.b    .Exit
  313. .OK        move.l    -4(A0),D1
  314.         beq.b    .Exit
  315.         bmi.b    .Exit
  316.         move.l    D1,xfdrr_MinTargetLen(A1)
  317.         move.l    D1,xfdrr_FinalTargetLen(A1)
  318.         sub.l    D2,A0
  319.         addq.l    #4,A0
  320.         move.l    A0,xfdrr_MinSourceLen(A1)
  321.         move.l    (A7)+,D2
  322.         moveq    #1,d0
  323.         rts
  324. .Exit        move.l    (A7)+,D2
  325.         moveq    #0,d0
  326.         rts
  327.  
  328. DB_MARC        movem.l    d2-d7/a2-a6,-(a7)
  329.         move.l    a0,a5
  330.  
  331.         move.l    xfdbi_UserTargetBuf(A5),A1
  332.         move.l    xfdbi_SourceBuffer(A5),A0
  333.         move.l    xfdbi_MinSourceLen(A5),D0
  334.  
  335.         adda.l    D0,A0
  336.         subq.l    #4,A0
  337.  
  338.         movea.l    -(A0),A2
  339.         adda.l    A1,A2
  340.         move.l    -(a0),d5
  341.         move.l    -(a0),d0
  342.  
  343.         bsr.w    D_CRUN
  344.  
  345.         tst.l    d0
  346.         bne.w    Error
  347.  
  348.         moveq    #1,d0
  349. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  350.         rts
  351.  
  352. **************************************************
  353.  
  354. S_xVdg        dc.l    S_AMOS        ;more slaves
  355.         dc.w    2        ;version
  356.         dc.w    39        ;master version
  357.         dc.l    N_xVdg        ;name
  358.         dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
  359.         dc.w    0
  360.         dc.l    RB_xVdg        ;recog buffer
  361.         dc.l    DB_xVdg        ;decrunch buffer
  362.         dc.l    0        ;recog segment
  363.         dc.l    0        ;decrunch segment
  364.         dc.w    0,0
  365.         dc.l    12+2
  366.  
  367. RB_xVdg        cmp.l    #'xVdg',(A0)+
  368.         bne.s    .Exit
  369.         tst.b    (A0)
  370.         bne.b    .Exit
  371.         move.l    (A0)+,D1
  372.         beq.b    .Exit
  373.         bmi.b    .Exit
  374.         moveq    #12,D0
  375.         move.l    D1,xfdrr_MinTargetLen(A1)
  376.         sub.l    D0,D1
  377.         move.l    D1,xfdrr_FinalTargetLen(A1)
  378.         tst.b    (A0)
  379.         bne.b    .Exit
  380.         move.l    (A0),D1
  381.         beq.b    .Exit
  382.         btst    #0,D1
  383.         bne.b    .Exit
  384.         add.l    D0,D1
  385.         move.l    D1,xfdrr_MinSourceLen(A1)
  386.         moveq    #1,d0
  387.         rts
  388. .Exit        moveq    #0,d0
  389.         rts
  390.  
  391. DB_xVdg        movem.l    d2-d7/a2-a6,-(a7)
  392.         move.l    a0,a5
  393.         move.l    xfdbi_UserTargetBuf(A5),A1
  394.         move.l    xfdbi_SourceBuffer(A5),A0
  395.         move.l    xfdbi_MinSourceLen(A5),D0
  396.         adda.l    D0,A0
  397.         movea.l    -(A0),A2
  398.         adda.l    A1,A2
  399.         move.l    -(a0),d5
  400.         move.l    -(a0),d0
  401.         bsr.w    D_CRUN
  402.         tst.l    d0
  403.         bne.w    Error
  404.         moveq    #1,d0
  405. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  406.         rts
  407.  
  408. **************************************************
  409.  
  410. S_AMOS        dc.l    S_ARPF        ;more slaves
  411.         dc.w    1        ;version
  412.         dc.w    33        ;master version
  413.         dc.l    N_AMOS        ;name
  414.         dc.w    XFDPFF_RELOC    ;flags
  415.         dc.w    0
  416.         dc.l    RB_AMOS        ;recog buffer
  417.         dc.l    DB_AMOS        ;decrunch buffer
  418.         dc.l    0        ;recog segment
  419.         dc.l    0        ;decrunch segment
  420.  
  421. RB_AMOS        cmp.l    #4000,d0
  422.         ble.w    .Exit
  423.  
  424.         cmp.l    #$3F3,(a0)
  425.         bne.w    .Exit
  426.  
  427.         move.l    a0,-(a7)
  428.  
  429.         move.l    8(a0),d1    ;how much hunks
  430.         lsl.l    #2,d1        ; * 4
  431.         CMP.L    D1,D0
  432.         BLO.W    .Ex
  433.         add.l    d1,a0
  434.         add.w    #$1c,a0
  435.  
  436.         cmp.l    #'CmdL',$332-$22(a0)    ; Amos Pro CLI
  437.         bne.b    .Ex1
  438.         cmp.l    #'CmdL',$3A0-$22(a0)
  439.         bne.b    .Ex1
  440.         cmp.l    #'CmdL',$490-$22(a0)
  441.         bne.b    .Ex1
  442.         cmp.l    #'xVdg',$8DE-$22(a0)
  443.         bne.b    .Ex1
  444.         bra.w    .Ok
  445. .Ex1
  446.         cmp.l    #'CmdL',$418-$22(a0)    ; Amos Pro Wb
  447.         bne.b    .Ex2
  448.         cmp.l    #'CmdL',$486-$22(a0)
  449.         bne.b    .Ex2
  450.         cmp.l    #'CmdL',$576-$22(a0)
  451.         bne.b    .Ex2
  452.         cmp.l    #'xVdg',$9C4-$22(a0)
  453.         bne.b    .Ex2
  454.         bra.b    .Ok
  455. .Ex2
  456.         cmp.l    #'CmdL',$362-$22(a0)    ; Amos Wb
  457.         bne.b    .Ex3
  458.         cmp.l    #'xVdg',$708-$22(a0)
  459.         bne.b    .Ex3
  460.         cmp.l    #'xVdg',$776-$22(a0)
  461.         bne.b    .Ex3
  462.         bra.b    .Ok
  463. .Ex3
  464.         cmp.l    #'CmdL',$262(a0)    ; Amos Wb
  465.         bne.b    .Ex31
  466.         cmp.l    #'xVdg',$5BA(a0)
  467.         bne.b    .Ex31
  468.         cmp.l    #'xVdg',$628(a0)
  469.         bne.b    .Ex31
  470.         bra.b    .Ok
  471. .Ex31
  472.         cmp.l    #'CmdL',$2D0-$22(a0)    ; Amos CLI
  473.         bne.b    .Ex
  474.         cmp.l    #'CmdL',$2F0-$22(a0)
  475.         bne.b    .Ex
  476.         cmp.l    #'CmdL',$540-$22(a0)
  477.         bne.b    .Ex
  478.         cmp.l    #'xVdg',$7B2-$22(a0)
  479.         bne.b    .Ex
  480.         cmp.l    #'xVdg',$820-$22(a0)
  481.         bne.b    .Ex
  482.  
  483. .Ok        move.l    (a7)+,a0
  484.         move.l    8(a0),d1    ;how much hunks
  485.         add.l    $14(a0),d1    ;first hunk size
  486.         lsl.l    #2,d1        ; * 4
  487.         add.l    #$1c+$c,d1
  488.         CMP.L    D1,D0
  489.         blo.b    .Exit    
  490.         add.l    d1,a0
  491.         cmp.l    #'xVdg',(a0)
  492.         bne.b    .Exit
  493.         moveq    #1,d0
  494.         rts
  495. .Ex        move.l    (a7)+,a0
  496. .Exit        moveq    #0,d0
  497.         rts
  498.  
  499. DB_AMOS        movem.l    d2-d7/a2-a6,-(a7)
  500.         move.l    a0,a5
  501.         move.l    xfdbi_SourceBuffer(a5),a2
  502.  
  503.         move.l    a2,a0
  504.         move.l    8(a0),d0    ; how much hunks
  505.         move.l    d0,d1
  506.         lsl.l    #2,d1        ; * 4
  507.         add.l    d1,a0
  508.         add.w    #$1c,a0
  509.         move.l    a0,a1
  510.         subq.l    #1,d0
  511. .Loop
  512.         cmpi.l    #'xVdg',(a0)
  513.         bne.b    .NotPacked
  514.  
  515.         add.l    4(a0),a1    ; unpack len
  516.         move.l    -4(a0),d1    ; hunk size
  517.         lsl.l    #2,d1        ; * 4
  518.         add.l    d1,a0
  519.         add.w    #$c,a0
  520.         dbf    d0,.Loop
  521.         bra.b    .Alloc
  522. .NotPacked
  523.         move.l    -4(a0),d1    ; hunk size
  524.         lsl.l    #2,d1        ; * 4
  525.         add.l    d1,a0
  526.         add.w    #$c,a0
  527.         add.l    d1,a1
  528.         add.w    #$c,a1
  529.         dbf    d0,.Loop
  530. .Alloc
  531.         sub.l    a2,a1
  532.         move.l    a1,d0
  533.  
  534.         subq.l    #8,d0
  535.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  536.         addq.l    #8,d0
  537.         move.l    d0,xfdbi_TargetBufLen(a5)
  538.  
  539.         move.l    xfdbi_TargetBufMemType(a5),d1
  540.         move.l    4.w,a6
  541.         jsr    -198(a6)
  542.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  543.         move.l    d0,xfdbi_TargetBuffer(a5)
  544.         beq.s    .Exit
  545.  
  546.         movem.l    d1-a6,-(a7)
  547.  
  548.         move.l    d0,a1
  549.         move.l    a2,a0
  550.         bsr.s    D_AMOS
  551.  
  552.         movem.l    (a7)+,d1-a6
  553.  
  554.         tst.l    d0
  555.         bne.w    Error2
  556.  
  557.         moveq    #1,d0
  558. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  559.         rts
  560.  
  561. **************************************************
  562.  
  563. D_AMOS
  564.         lea    $14(a1),a2        ;first hunk length
  565.         move.l    8(a0),d0        ;how much hunks
  566.         move.l    d0,d1
  567.         lsl.l    #2,d1            ; * 4
  568.         addi.w    #$1c-1,d1
  569. .Copy
  570.         move.b    (a0)+,(a1)+        ;copy header to dest
  571.         dbf    d1,.Copy
  572.         subq.w    #1,d0
  573. .Loop
  574.         cmpi.l    #'xVdg',(a0)        ;segment packed ?
  575.         bne.b    .NotPacked
  576.  
  577.         move.l    4(a0),d1        ;unpacked length
  578.         subi.w    #$c,d1
  579.         lsr.l    #2,d1            ; / 4
  580.         move.l    d1,-4(a1)
  581.         and.l    #$ff000000,(a2)        ; unpacked hunk len
  582.         add.l    d1,(a2)+
  583.  
  584.         movem.l    d0-d7/a0-a6,-(a7)
  585.  
  586.         bsr.b    .Decrunch
  587.         tst.l    d0
  588.         bne.b    .Corrupt
  589.  
  590.         movem.l    (a7)+,d0-d7/a0-a6
  591.  
  592.         add.l    4(a0),a1        ; add unpacked len
  593.         sub.w    #$c,a1
  594.         move.l    -4(a0),d1
  595.         lsl.l    #2,d1            ; * 4
  596.         add.l    d1,a0
  597.  
  598.         moveq    #$b,d1
  599. .Copy1
  600.         move.b    (a0)+,(a1)+
  601.         dbf    d1,.Copy1
  602.  
  603.         dbf    d0,.Loop
  604.         bra.b    .EndDecr
  605. .NotPacked
  606.         addq.w    #4,a2
  607.         move.l    -4(a0),d1
  608.         lsl.l    #2,d1            ; * 4
  609.         add.w    #$c-1,d1
  610. .Copy2
  611.         move.b    (a0)+,(a1)+
  612.         dbf    d1,.Copy2
  613.  
  614.         dbf    d0,.Loop
  615. .EndDecr
  616.         moveq    #0,d0
  617.         rts
  618.  
  619. .Corrupt
  620.         movem.l    (a7)+,d0-d7/a0-a6
  621.         moveq    #1,d0
  622.         rts
  623.  
  624. .Decrunch
  625.         move.l    8(a0),d0
  626.         add.w    #12,D0
  627.  
  628.         adda.l    D0,A0
  629.         movea.l    -(A0),A2
  630.         adda.l    A1,A2
  631.         move.l    -(a0),d5
  632.         move.l    -(a0),d0
  633.  
  634.         bsr.w    D_CRUN
  635.         rts
  636.  
  637. **************************************************
  638.  
  639. S_ARPF        dc.l    S_ARP3        ;more slaves
  640.         dc.w    2        ;version
  641.         dc.w    39        ;master version
  642.         dc.l    N_ARPF        ;name
  643.         dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
  644.         dc.w    0
  645.         dc.l    RB_ARPF        ;recog buffer
  646.         dc.l    DB_ARPF        ;decrunch buffer
  647.         dc.l    0        ;recog segment
  648.         dc.l    0        ;decrunch segment
  649.         dc.w    0,0
  650.         dc.l    12+2
  651.  
  652. RB_ARPF        cmp.l    #"ARPF",(A0)+
  653.         bne.s    .Exit
  654.         tst.b    (A0)
  655.         bne.b    .Exit
  656.         move.l    (A0)+,D1
  657.         beq.b    .Exit
  658.         btst    #0,D1
  659.         bne.b    .Exit
  660.         add.l    D1,A0
  661.         moveq    #12,D0
  662.         add.l    D0,D1
  663.         move.l    D1,xfdrr_MinSourceLen(A1)
  664.         tst.b    (A0)
  665.         bne.b    .Exit
  666.         move.l    (A0),D1
  667.         beq.b    .Exit
  668.         bmi.b    .Exit
  669.         move.l    D1,xfdrr_MinTargetLen(A1)
  670.         move.l    D1,xfdrr_FinalTargetLen(A1)
  671.         moveq    #1,d0
  672.         rts
  673. .Exit        moveq    #0,d0
  674.         rts
  675.  
  676. DB_ARPF        movem.l    d2-d7/a2-a6,-(a7)
  677.         move.l    a0,a5
  678.         move.l    xfdbi_UserTargetBuf(A5),A1
  679.         move.l    xfdbi_SourceBuffer(A5),A0
  680.         move.l    xfdbi_MinSourceLen(A5),D0
  681.         adda.l    D0,A0
  682.         movea.l    -(A0),A2
  683.         adda.l    A1,A2
  684.         move.l    -(a0),d5
  685.         move.l    -(a0),d0
  686.         bsr.w    D_CRUN
  687.         tst.l    d0
  688.         bne.w    Error
  689.         moveq    #1,d0
  690. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  691.         rts
  692.  
  693. **************************************************
  694.  
  695. S_ARP3        dc.l    S_ACE        ;more slaves
  696.         dc.w    2        ;version
  697.         dc.w    39        ;master version
  698.         dc.l    N_ARP3        ;name
  699.         dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
  700.         dc.w    0
  701.         dc.l    RB_ARP3        ;recog buffer
  702.         dc.l    DB_ARP3        ;decrunch buffer
  703.         dc.l    0        ;recog segment
  704.         dc.l    0        ;decrunch segment
  705.         dc.w    0,0
  706.         dc.l    12+2
  707.  
  708. RB_ARP3        movem.l    d2-d5,-(a7)
  709.         cmp.l    #'ARP3',(A0)+
  710.         bne.b    .Exit
  711.         tst.b    (A0)
  712.         bne.b    .Exit
  713.         move.l    (A0)+,D1
  714.         beq.b    .Exit
  715.         btst    #0,D1
  716.         bne.b    .Exit
  717.         move.l    (A0)+,D2
  718.         beq.b    .Skip1
  719.         btst    #0,D2
  720.         bne.b    .Exit
  721.         sub.l    #$C00000,D2
  722. .Skip1        move.l    (A0)+,D3
  723.         beq.b    .Skip2
  724.         btst    #0,D3
  725.         bne.b    .Exit
  726.         sub.l    #$200000,D3
  727. .Skip2        moveq    #16,D5
  728.         add.l    D5,D1
  729.         add.l    D1,A0
  730.         move.l    -(A0),D4
  731.         beq.b    .Exit
  732.         bmi.b    .Exit
  733.         tst.l    D2
  734.         beq.b    .NoSlow
  735.         add.l    D2,A0
  736.         add.l    (A0),D4
  737.         add.l    D2,D1
  738. .NoSlow        tst.l    D3
  739.         beq.b    .NoFast
  740.         add.l    D3,A0
  741.         add.l    (A0),D4
  742.         add.l    D3,D1
  743. .NoFast        add.l    D5,D1
  744.         move.l    D1,xfdrr_MinSourceLen(A1)
  745.         move.l    D4,xfdrr_FinalTargetLen(A1)
  746.         move.l    D4,xfdrr_MinTargetLen(A1)
  747.         moveq    #1,d0
  748.         bra.b    .End
  749.         rts
  750. .Exit        moveq    #0,d0
  751. .End        movem.l    (a7)+,d2-d5
  752.         rts
  753.  
  754. DB_ARP3        movem.l    d2-d7/a2-a6,-(a7)
  755.         move.l    a0,a5
  756.         move.l    xfdbi_UserTargetBuf(A5),A1
  757.         move.l    xfdbi_SourceBuffer(A5),A0
  758.         move.l    4(a0),d0
  759.         adda.l    D0,A0
  760.         lea    $20(A0),A0
  761.         movea.l    -(A0),A2
  762.         adda.l    A1,A2
  763.         move.l    -(a0),d5
  764.         move.l    -(a0),d0
  765.         bsr.w    D_CRUN
  766.         tst.l    D0
  767.         bne.w    Error
  768.         move.l    xfdbi_SourceBuffer(a5),a2
  769.         tst.l    8(A2)
  770.         beq.b    .skip3
  771.         addq.l    #8,A0
  772.         add.l    (A0)+,A1
  773.         add.l    8(A2),A0
  774.         sub.l    #$C00000,A0
  775.         movea.l    -(A0),A2
  776.         adda.l    A1,A2
  777.         move.l    -(a0),d5
  778.         move.l    -(a0),d0
  779.         bsr.w    D_CRUN
  780.         tst.l    D0
  781.         bne.w    Error
  782. .skip3        move.l    xfdbi_SourceBuffer(a5),a2
  783.         tst.l    12(A2)
  784.         beq.b    .skip4
  785.         addq.l    #8,A0
  786.         add.l    (A0)+,A1
  787.         add.l    12(A2),A0
  788.         sub.l    #$200000,A0
  789.         movea.l    -(A0),A2
  790.         adda.l    A1,A2
  791.         move.l    -(a0),d5
  792.         move.l    -(a0),d0
  793.         bsr.w    D_CRUN
  794. .skip4        tst.l    d0
  795.         bne.w    Error
  796.         moveq    #1,d0
  797. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  798.         rts
  799.  
  800. **************************************************
  801.  
  802. S_ACE        dc.l    S_Pepsi        ;no more slaves
  803.         dc.w    2        ;version
  804.         dc.w    39        ;master version
  805.         dc.l    N_ACE        ;name
  806.         dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
  807.         dc.w    0
  808.         dc.l    RB_ACE        ;recog buffer
  809.         dc.l    DB_ACE        ;decrunch buffer
  810.         dc.l    0        ;recog segment
  811.         dc.l    0        ;decrunch segment
  812.         dc.w    0,0
  813.         dc.l    12+2
  814.  
  815. RB_ACE        cmp.l    #"ACE!",(A0)+
  816.         bne.s    .Exit
  817.         tst.b    (A0)
  818.         bne.b    .Exit
  819.         move.l    (A0)+,D1
  820.         beq.b    .Exit
  821.         btst    #0,D1
  822.         bne.b    .Exit
  823.         moveq    #12,D0
  824.         add.l    D0,D1
  825.         move.l    D1,xfdrr_MinSourceLen(A1)
  826.         tst.b    (A0)
  827.         bne.b    .Exit
  828.         move.l    (A0),D1
  829.         beq.b    .Exit
  830.         bmi.b    .Exit
  831.         move.l    D1,xfdrr_MinTargetLen(A1)
  832.         move.l    D1,xfdrr_FinalTargetLen(A1)
  833.         moveq    #1,d0
  834.         rts
  835. .Exit        moveq    #0,d0
  836.         rts
  837.  
  838. DB_ACE        movem.l    d2-d7/a2-a6,-(a7)
  839.         move.l    a0,a5
  840.         move.l    xfdbi_UserTargetBuf(A5),A1
  841.         move.l    xfdbi_SourceBuffer(A5),A0
  842.         move.l    xfdbi_MinSourceLen(A5),D0
  843.         move.l    8(a0),a2
  844.         move.l    12(a0),d5
  845.         adda.l    D0,A0
  846.         adda.l    A1,A2
  847.         move.l    -(a0),d0
  848.         bsr.w    D_CRUN
  849.         tst.l    d0
  850.         bne.w    Error
  851.         moveq    #1,d0
  852. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  853.         rts
  854.  
  855. **************************************************
  856.  
  857. S_Pepsi        DC.L    0        ;next slave
  858.         DC.W    2        ;version
  859.         DC.W    39        ;master version
  860.         DC.L    N_Pepsi        ;name
  861.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  862.         DC.W    0
  863.         DC.L    RB_Pepsi    ;recog buffer
  864.         DC.L    DB_Pepsi    ;decrunch buffer
  865.         DC.L    0        ;recog segment
  866.         DC.L    0        ;decrunch segment
  867.         DC.W    0,0
  868.         DC.L    $10        ;MinBufSize
  869.  
  870. PEP_SOURCELEN    EQU    4
  871. PEP_DESTLEN    EQU    8
  872. PEP_PACKMATCH    EQU    $025569EE
  873.  
  874. RB_Pepsi    MOVEQ    #0,D0            ; False
  875.  
  876.         CMPI.L    #"PACK",(A0)
  877.         BNE.B    .No
  878.  
  879.         MOVE.L    PEP_SOURCELEN(A0),D1
  880.         SUBI.L    #PEP_PACKMATCH,D1 ; must be greater than PACKMATCH
  881.         BLE.B    .No
  882.         CMP.L    #$C800000,D1      ; should be shorther than 200MB
  883.         BGT.B    .No
  884.         ADD.L    #16,D1
  885.         MOVE.L    D1,xfdrr_MinSourceLen(A1)
  886.         MOVE.L    PEP_DESTLEN(A0),D1
  887.         CMP.L    PEP_SOURCELEN(A0),D1 ; source <= destination
  888.         BLE.B    .No
  889.         SUBI.L    #PEP_PACKMATCH,D1 ; must be greater than PACKMATCH
  890.         BLE.B    .No
  891.         CMP.L    #$C800000,D1      ; should be shorther than 200MB
  892.         BGT.B    .No
  893.  
  894.         MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  895.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  896.         MOVEQ    #1,D0            ; True
  897. .No        RTS
  898.  
  899. DB_Pepsi    movem.l    d2-d7/a2-a6,-(a7)
  900.         move.l    a0,a5
  901.         move.l    xfdbi_UserTargetBuf(a5),a1
  902.         move.l    xfdbi_SourceBuffer(a5),a0
  903.         move.l    xfdbi_TargetBufSaveLen(a5),a2
  904.         move.l    xfdbi_MinSourceLen(a5),d0
  905.         move.l    12(a0),d5
  906.         adda.l    a1,a2
  907.         adda.l    d0,a0
  908.         move.l    -(a0),d0
  909.         bsr.w    D_CRUN
  910.         tst.l    d0
  911.         bne.w    Error
  912.         moveq    #1,d0
  913.         movem.l    (a7)+,d2-d7/a2-a6
  914.         rts
  915.  
  916.         END
  917.